iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 19
0
Software Development

Swift零基礎實作旅遊景點app系列 第 19

Swift-Day 19:練習連接API(結果失敗,再想想哪邊出問題,換了另外一個API結果就跑得出來)

  • 分享至 

  • xImage
  •  

之前的章節有基礎地學習過URLSession,以URLSession將API下載下來後,再進行JSON的處理,在Swift4中有新增加JSONDecoder以及Codable,可以不用像以往層層頗析JSON或者是利用第三方函式庫。
以下是練習用的API:
http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors
利用Online JSON Viewer可以看到結構:

2. 實作部分:

  • 新增一個Swift file檔,裡面程式碼如下,要讓JSONDecoder.decode接受的參數必須遵守Codable protocol,:
class Actors: Codable{
    let actors:[Actor]   
    init(actors: [Actor]) {
        self.actors = actors
    }
}

class Actor: Codable {
    let name: String
    let des: String
    let dob: String
    let country: String
    let height: String
    let spouse: String
    let children: String
    let image: String
    
    init(name: String, des: String, dob: String, country: String, height: String, spouse: String, children: String, image: String) {
        self.name = name
        self.des = des
        self.dob = dob
        self.country = country
        self.height = height
        self.spouse = spouse
        self.children = children
        self.image = image
    }
}
  • 在ViewController的部分:
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var actors = [Actor]()
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return actors.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let actorCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ActorTableViewCell
        actorCell.nameLabel.text = actors[indexPath.row].name
        actorCell.heightLabel.text = actors[indexPath.row].height
           return actorCell
    }
       @IBOutlet weak var actorTableView: UITableView!
    let apiAddress = "http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors"
    override func viewDidLoad() {
        super.viewDidLoad()
        actorTableView.delegate = self
        actorTableView.dataSource = self
        downloadJSOn(webAddress: apiAddress)
    }   
    //以URLSession來下載
    func downloadJSOn(webAddress:String){
        if let url = URL(string: webAddress){
            let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, URLResponse, error) in
                if error != nil{
                    print("Something is wrong")
                    return
                }
                if let downloadedData = data{
                    do{
                        let decoder = JSONDecoder()
                        let downloadedActors = try decoder.decode(Actors.self, from: downloadedData)
                        self.actors = downloadedActors.actors
                        DispatchQueue.main.async {
                            self.actorTableView.reloadData()
                        }
                    }
                    catch{
                      print("something wrong after downloaded")
                    }
                }
            })
            task.resume()
        }
    }
}

但結果卻不如預想能夠在TableView產生演員的名字及身高,而是空白的一片,再來找找bug是出現在哪邊,一樣的寫法只是把api換成另外一個,結果有顯示出來。但還是會再做一次確認。


上一篇
Swift-Day18: 旅遊App-Part III
下一篇
Swift-Day20:在TableView上建立搜尋功能
系列文
Swift零基礎實作旅遊景點app30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言